﻿#ifndef __AF_STACK_H__
#define __AF_STACK_H__

namespace AF
{
	//template<class T> class Struct -* _INTERFACE ForEach
		//template<class T> class Link
			template<class T> class Stack;
}
#define AF_CStack		AF::Stack

namespace AF
{
	/// 堆栈结构模板类
	template<class T>
	class Stack : public Link<T>
	{
	public:
		Stack();
		~Stack();

	public:
		/// 压栈操作
		bool		Push(const T& tPush);
		/// 弹栈操作
		bool		Pop(T& _OUT tPop);	// 由于属于将唯一内容传出，采用参数形式

	private: // 屏蔽功能
		int		Add(const T& tNew);
		bool		Insert(const T& tNew, const T* ptNode = NULL);
		bool		Remove(const T& tNode);
	};



	template<class T>
	Stack<T>::Stack()
	{
	}

	template<class T>
	Stack<T>::~Stack()
	{
	}

	template<class T>
	bool Stack<T>::Push(const T& tPush)
	{
		return AF_LINK_THIS->Add(tPush) > 0;
	}

	template<class T>
	bool Stack<T>::Pop(T& _OUT tPop)
	{
		if(AF_LINK_THIS->m_pnEnd == NULL)
		{
			_MEMCPY(&tPop, &m_tNull, sizeof(T));
			return false;
		}

		T tNode = (T)AF_LINK_THIS->GetEnd();
		_MEMCPY(&tPop, &tNode, sizeof(T));

		AF_LINK_THIS->Remove(tNode);

		return true;
	}
}

#endif